export function calculateWorkMinutes(workTime) {
	function timeToMinutes(timeString) {
		const [hours, minutes] = timeString.split(':').map(Number);
		return hours * 60 + minutes;
	}

	// 转换时间对象为分钟
	const startTime1 = timeToMinutes(workTime.time1);
	const endTime1 = timeToMinutes(workTime.time2);
	const startTime2 = timeToMinutes(workTime.time3);
	const endTime2 = timeToMinutes(workTime.time4);

	// 计算每个时间段的分钟数，并考虑可能跨越午夜的情况（但在这个特定问题中，我们不需要考虑，因为时间都在同一天内）
	const minutesWorked1 = endTime1 - startTime1;
	const minutesWorked2 = endTime2 - startTime2;

	// 返回总分钟数
	return minutesWorked1 + minutesWorked2;
}

export function getEntryTime(startDateString) {
	const dateFormat = 'YYYY/MM/DD';
	const startDate = new Date(startDateString.replace(/(\d{4})\/(\d{2})\/(\d{2})/, '$1-$2-$3'));
	const endDate = new Date();
	const diffInMilliseconds = Math.abs(endDate - startDate);
	const diffInDays = Math.floor(diffInMilliseconds / (1000 * 60 * 60 * 24));
	return diffInDays;
}

// 获取当月工作日有几天
export function getWorkDaysInMonth(year, month, holidays) {
	const firstDayOfMonth = new Date(year, month - 1, 1);
	const lastDayOfMonth = new Date(year, month, 0);
	const daysInMonth = lastDayOfMonth.getDate();
	// 初始化工作日天数计数器
	let workDays = 0;

	// 遍历该月份的每一天
	for (let day = 1; day <= daysInMonth; day++) {
		// 创建当前日期的Date对象
		const currentDate = new Date(year, month - 1, day);

		// 检查当前日期是否是周末（周六或周日）
		const isWeekend = currentDate.getDay() === 0 || currentDate.getDay() === 6;

		// 检查当前日期是否是节假日
		const dateString = currentDate.toISOString().split('T')[0]; // 转换为'YYYY-MM-DD'格式
		const isHolidayDate = holidays.includes(dateString);

		// 如果当前日期既不是周末也不是节假日，则增加工作日天数计数器
		if (!isWeekend && !isHolidayDate) {
			workDays++;
		}
	}

	// 返回该月份的工作日天数
	return workDays;
}
// 计算当天已上班分钟数
export function hasWorkedMinutes(workTime) {
	// 辅助函数，用于将时间字符串（'HH:MM'）转换为分钟数
	function timeToMinutes(timeString) {
		const [hours, minutes] = timeString.split(':').map(Number);
		return hours * 60 + minutes;
	}

	// 获取当前时间的分钟数
	function getCurrentMinutes() {
		const now = new Date();
		const currentHours = now.getHours();
		const currentMinutes = now.getMinutes();
		return currentHours * 60 + currentMinutes;
	}

	// 转换时间对象为分钟
	const startTime1 = timeToMinutes(workTime.time1);
	const endTime1 = timeToMinutes(workTime.time2);
	const startTime2 = timeToMinutes(workTime.time3);
	const endTime2 = timeToMinutes(workTime.time4);

	// 获取当前时间的分钟数
	const currentMinutes = getCurrentMinutes();

	// 初始化第一个时间段内已工作分钟数计数器
	let workedMinutesInFirstPeriod = 0;

	// 检查当前时间是否处于第一个时间段内
	if (currentMinutes >= startTime1 && currentMinutes < endTime1) {
		workedMinutesInFirstPeriod = currentMinutes - startTime1;
	} else if (currentMinutes >= endTime1) {
		// 如果当前时间超过了第一个时间段的结束时间，则第一个时间段内的工作时间为整个时间段
		workedMinutesInFirstPeriod = endTime1 - startTime1;
	}

	// 初始化第二个时间段内已工作分钟数计数器
	let workedMinutesInSecondPeriod = 0;

	// 检查当前时间是否处于第二个时间段内
	if (currentMinutes >= startTime2 && currentMinutes < endTime2) {
		workedMinutesInSecondPeriod = currentMinutes - startTime2;
	} else if (currentMinutes >= endTime2) {
		// 如果当前时间超过了第二个时间段的结束时间，则第二个时间段内的工作时间为整个时间段
		workedMinutesInSecondPeriod = endTime2 - startTime2;
	}

	// 计算两个时间段内已工作的总分钟数
	const totalWorkedMinutes = workedMinutesInFirstPeriod + workedMinutesInSecondPeriod;

	// 返回已工作的总分钟数
	return totalWorkedMinutes;
}

// 距离周末放假
export function culGetSatTime() {
	// 获取当前日期
	const currentDate = new Date();

	// 获取当前是星期几（0代表周日，1代表周一，...，6代表周六）
	const currentDayOfWeek = currentDate.getDay();

	// 计算到下一个周六还需要多少天
	let daysUntilNextSaturday;
	if (currentDayOfWeek === 6) {
		// 如果今天就是周六，则到下一个周六是7天（包含当天）
		daysUntilNextSaturday = 7;
	} else {
		// 否则，计算到下一个周六的天数（不包含当天，但需要包含在内则需+1）
		daysUntilNextSaturday = (6 - currentDayOfWeek);
	}
	return daysUntilNextSaturday
}


/**
 * 计算当前日期距离下次发薪日的天数
 * @param {number} payDay - 每月的发薪日(1-31)
 * @param {Date} [currentDate] - 可选参数，当前日期，默认为系统当前日期
 * @returns {number} 距离下次发薪日的天数
 */
export function getDaysToPayday(payDay, currentDate = new Date()) {
	// 验证发薪日参数
	if (payDay < 1 || payDay > 31) {
		throw new Error('发薪日必须在1-31之间');
	}

	const currentYear = currentDate.getFullYear();
	const currentMonth = currentDate.getMonth();
	const currentDay = currentDate.getDate();

	// 计算本月发薪日
	const payDateThisMonth = new Date(currentYear, currentMonth, payDay);

	// 如果本月发薪日还未到
	if (currentDay <= payDay) {
		const diffTime = payDateThisMonth - currentDate;
		return Math.ceil(diffTime / (1000 * 60 * 60 * 24));
	}

	// 如果本月发薪日已过，计算下个月的发薪日
	let nextMonth = currentMonth + 1;
	let nextYear = currentYear;

	if (nextMonth > 11) {
		nextMonth = 0;
		nextYear++;
	}

	const payDateNextMonth = new Date(nextYear, nextMonth, payDay);
	const diffTime = payDateNextMonth - currentDate;
	return Math.ceil(diffTime / (1000 * 60 * 60 * 24));
}


/**
 * 计算退休剩余时间
 * @param {string} birthDate - 格式YYYY/MM/DD
 * @param {number} gender - 1:男性 2:女性
 * @returns {Object} { years: number, months: number }
 */
export function getRetirementYears(birthDate, gender) {
	// 参数验证
	const dateRegex = /^\d{4}\/\d{2}\/\d{2}$/;
	if (!dateRegex.test(birthDate)) throw new Error('日期格式应为YYYY/MM/DD');
	if (![1, 2].includes(gender)) throw new Error('性别参数应为1(男)或2(女)');

	const currentDate = new Date(); // 动态获取当前日期
	const birth = new Date(birthDate);

	// 设置退休年龄(男60/女55)
	const retireAge = gender === 1 ? 60 : 55;
	const retireDate = new Date(
		birth.getFullYear() + retireAge,
		birth.getMonth(),
		birth.getDate()
	);

	// 计算时间差
	let years = retireDate.getFullYear() - currentDate.getFullYear();
	let months = retireDate.getMonth() - currentDate.getMonth();

	// 月份修正
	if (months < 0 || (months === 0 && retireDate.getDate() < currentDate.getDate())) {
		years--;
		months += 12;
	}

	return {
		years: Math.max(0, years),
		months: Math.max(0, months)
	};
}


/**
 * 计算年度工资收入（截止到当前日期）
 * @param {Date|string} hireDate - 入职日期（格式：YYYY-MM-DD）
 * @param {number} monthlySalary - 月薪
 * @param {string[]} holidays - 节假日数组（格式：YYYY-MM-DD）
 * @returns {number} 年度总收入（保留两位小数）
 */
export function calculateAnnualSalary(hireDate, monthlySalary, holidays = []) {
	// 日期处理
	const today = new Date();
	today.setHours(0, 0, 0, 0); // 清除时间部分
	const currentYear = today.getFullYear();
	hireDate = new Date(hireDate);

	// 转换节假日为Set（MM-DD格式）
	const holidaySet = new Set(holidays.map(d => d.slice(5)));

	// 计算指定月份的工作日数
	const getWorkdays = (year, month, endDay) => {
		let count = 0;
		const date = new Date(year, month, 1);

		while (date.getMonth() === month && date.getDate() <= endDay) {
			const day = date.getDay();
			const dateStr =
			`${String(date.getMonth()+1).padStart(2,'0')}-${String(date.getDate()).padStart(2,'0')}`;
			if (day !== 0 && day !== 6 && !holidaySet.has(dateStr)) count++;
			date.setDate(date.getDate() + 1);
		}
		return count;
	};

	let total = 0;

	// 计算当前年份（从1月开始）
	for (let month = 0; month <= today.getMonth(); month++) {
		// 处理入职前的月份（跳过未入职月份）
		if (hireDate.getFullYear() < currentYear || month >= hireDate.getMonth()) {
			const isCurrentMonth = (month === today.getMonth());
			const monthEndDay = isCurrentMonth ? today.getDate() - 1 : new Date(currentYear, month + 1, 0).getDate();

			if (!isCurrentMonth) {
				// 整月工资（1-4月）
				total += monthlySalary;
			} else {
				// 当月工资（5月）
				const totalWorkdays = getWorkdays(currentYear, month, new Date(currentYear, month + 1, 0).getDate());
				const workedDays = getWorkdays(currentYear, month, monthEndDay);
				total += (monthlySalary / totalWorkdays) * workedDays;
			}
		}
	}
	return Number(total.toFixed(2));
}